Amazon RDSによるレプリケーションについて理解する
Amazon RDSとは
Amazon RDSは、AWSが提供するデータベースサービスです。別にEC2上にMySQLとかインストールすれば使わないんじゃない?って思う方もいらっしゃると思いますが、実はスゴいサービスなんです。何故サービスと名付けているか、それは、高可用性や耐障害性を実現しているからです。世の中の多くのシステムは、データベースが壊れるとシステム全体が止まってしまいます。ですから、データベースが止まらないように設計・運用する必要があります。
フォールトトレランスとは
フォールトトレランスとは障害発生時にサービス全体を止めずにシステムを動かし続けることです。障害が起きないようにすることも大事ですが、障害が起こったときの対応も重要ですよね。Amazon RDSは、MultiAZ・リードレプリカによって障害に強いサービスを実現しています。
MultiAZ構成
RDSには起動時にMultiAZオプションが用意されています。これは、マスター(プライマリ)とスレーブ(セカンダリ)の構成で、2つのデータセンター(Availability Zone)に渡って構築してくれます。ボタンひとつで実現できる仕組みですからデータベースの専門家で無くても扱えます。マスターへの変更が自動的にスレーブに反映されるレプリケーションの仕組みです。
同期レプリケーションと非同期レプリケーション
RDSのMultiAZは、データベースの障害時の影響を最小化するために同期レプリケーションを行っています。これは、マスターへの変更の後にスレーブを変更し確定してから応答します。よって、マスターとスレーブ間の通信の分だけ遅くなってしまいますが、RDSは、データセンター間を高速な回線で繋ぐことで数msの遅延と非常に高速です。ちなみに、非同期レプリケーションは、スレーブへの書き込み完了を待たずに応答します。ということで、RDSは、MultiAZ構成において同期レプリケーションを行っています。
論理レプリケーションと物理レプリケーション
RDSのMultiAZは、マスターとスレーブ間で物理レプリケーションを行っています。これは、トランザクションが完了する前のマスターへのページ書き込みが起こったタイミングでスレーブにも並行で書き込みを行いますので高速です。これは、DRBDの仕組みに似ています。RDSは、InnoDBを使っていて、電源/ネットワーク障害が発生した場合にデータの整合性を保ちます。ちなみに、論理レプリケーションは、マスターに対するSQL文等のトランザクションレベルの操作をスレーブにも行います。ということで、RDSは、MultiAZ構成において物理レプリケーションを行っています。
フェイルオーバーの手順
マスターがクラッシュした場合、マスターへの書き込みが止まり、IPアドレスの付け替えによってスレーブがマスターに昇格にします。このフェイルオーバーに掛かる時間は約3-4分です。実際のところ内部では、InnoDBのトランザクションログから復旧をしています。このログについて利用者がコントロールすることはできません。そのかわり、自動的に行ってくれます。RDSでは、最近強制的にフェイルオーバーする機能が付きましたので導入テストができるかと思います。
リードレプリカ
RDSでは、非同期のレプリケーションとしてリードレプリカという機能を提供しています。これは、読み込み専用のデータベースとして利用することができます。MultiAZ構成のときにはスレーブに対して利用者が直接アクセスすることはできませんでしたが、リードレプリカの場合は直接アクセス可能です。読み込みが多いアプリケーションの場合に負荷を分散することができます。ただし、非同期のレプリケーションですので、常に最新のデータが取れる訳ではありませんので注意してください。更新系はマスターで参照系はレプリカでという使い方が想定されています。
スケールアップ
RDSは、EC2と同じようにスケールアップをすることができます。スナップショットからデータベースを作成する際に大きなインスタンスタイプを指定すればOKです。データベースの性能不足になったらまずはスケールアップ(SmallからLarge等)しましょう。また、ディスク容量が足りないときもボタンひとつで簡単に増やすことができます。
まとめ
同期・非同期・物理・論理のレプリケーションについてイメージ掴めましたでしょうか?RDSの特徴をしっかりおさえて、ノンストップ・ノンメンテナンス・ノンアドミンなデータベースライフを楽しみましょう。今日から君も深夜土日勤務が無くなるかも!?
参考資料
Replication for Availability & Durability with MySQL and Amazon RDS